<?php
class ACotizacionProduccion {

	public function __construct() {
	}

	public function generarSolicitudProduccion(EFacade & $facade) {

		$docCP = & $facade->getDocumentRoot();		
		$listaProductos=$docCP->listaProductos;	
		$workflowCP = & $facade->getWorkflow();	
		$ezpdo_=getManager();
		foreach ($listaProductos as $lista){
			$cantidad=$lista->cantidad;
			$producto =$lista->productoFinal;
			/********* SOLICITUD DE PRODUCCION ********/
			$docRoot = $facade->session->create('DSolicitudProduccionCotizacion');
			$docRoot->cotizacion=$docCP;
			$docRoot->producto=$producto;
			$docRoot->cantidad=$cantidad;
			$docRoot->especificacion = $lista->especificacion;
			$docRoot->epSetDirty(TRUE);
			$docRoot->commit();
			$nro = $docRoot->getDocumentType().'-';
			$nro .= date('mdY');
			$nro .= $docRoot->epGetObjectId();
			$docRoot->numero = $nro; 
			$docRoot->commit();
			/********* REQUERIMIENTO DE PRODUCCION ********/				
			$req = $facade->session->create('DRequerimientoProduccion');
			$req->epSetCommittable(FALSE,FALSE);
			$role = NULL;
			$req->estado = 1;
			$req->producto = $docRoot->producto;
			$req->metodo = $docRoot->producto->usaLaMatriz[0]->metodoUsado;
			$req->cantidad = $docRoot->cantidad;
			$req->asociadoACotizacion = $docRoot;
			$req->epSetCommittable(TRUE);
			$req->epSetDirty(TRUE);
			$req->commit();
			$nro = $req->getDocumentType().'-';
			$nro .= date('mdY');
			$nro .= $req->epGetObjectId();
			$req->numero = $nro;
			$req->diferenciador=$req->getDocumentDifer();
			$req->commit();
			$ezpdo_=getManager();
			$tipoHorario = 0;
			$solicitud = $ezpdo_->create('DSolicitudProduccionCotizacion');
			$solicitud->epSetCommittable(FALSE,FALSE);
			$solicitud->producto=$docRoot->producto;
			$solicitud->cantidad = $req->cantidad;
			$metodoUsado= $docRoot->producto->usaLaMatriz[0]->metodoUsado;
			$metodo = new PResultadoEvaluacionMetodo;
			$resultado = $metodo->evaluacion($solicitud, $metodoUsado, $tipoHorario, $ezpdo_);
//			$metodo->imprimir();
			/**--------------RESERVA DE INSUMOS SOLAMENTE -----------**/
			$consulta = "FROM MPlanProduccion AS pp WHERE pp.condicionVigencia = 1";
			$planes = $ezpdo_->find($consulta);
			if(count($planes) == 0 || count( $planes) == 1 ) {
				if(count($planes) == 0) {
					$planVigente = $ezpdo_->create('MPlanProduccion');
					$nroSecuencias = 0;
					$planVigente->condicionVigencia=1;
				}
				else {
					$planVigente = $planes[0];
					$nroSecuencias = $planVigente->sigue->count();
				}
				$secuencia = $ezpdo_->create('MSecuenciaProduccion');
				$secuencia->metodo = $req->metodo;
				$secuencia->actividades = array();
				$secuencia->correspondeA = $req;
				$nroEtapa = 0;
				$actividadProduccion = array();
				foreach($metodo->etapaEnEvaluacion as $etapa) {
					$actividadProduccion[$nroEtapa] = $ezpdo_->create('MActividad');
					$actividadProduccion[$nroEtapa]->fechaInicio = $etapa->fechaInicio;
					$actividadProduccion[$nroEtapa]->duracion = $etapa->duracion;
					$actividadProduccion[$nroEtapa]->fechaFin = $etapa->fechaFin;
					$actividadProduccion[$nroEtapa]->nombre = $etapa->nombre;
					$actividadProduccion[$nroEtapa]->numero = $nroEtapa;
					$actividadProduccion[$nroEtapa]->estado = 0; // 0 significa que esta programada pero no ha sido asignada ni esta en ejecucion
					$actividadProduccion[$nroEtapa]->correspondeA = $secuencia;
					$actividadProduccion[$nroEtapa]->satisfaceA = $req;
					$actividadProduccion[$nroEtapa]->esEnPrograma = 0;
					$actividadProduccion[$nroEtapa]->necesitaFuncionalidades = array();
//					$nPro = 0;
//					$reservaProductos = array();
//					foreach($etapa->insumoEval as $insumo) {
//						$reservaProducto[$nPro] = new PReservaProductoRequerimiento($insumo->insumo,  $etapa->fechaInicio, $insumo->cantidad,  
//						$actividadProduccion[$nroEtapa], $req);
//						$reserva = $reservaProducto[$nPro]->hacerReserva($ezpdo_);
//						$actividadProduccion[$nroEtapa]->necesitaProductos[$nPro]=$reserva;
//						$nPro++;
//					}
					$nPro = 0;
					$secuencia->actividades[$nroEtapa] = $actividadProduccion[$nroEtapa];
					$nroEtapa++;
				}
				$planVigente->sigue[$nroSecuencias] = $secuencia;			
				$planVigente->commit();
			}
		 	$programa = new PPrograma($secuencia, $ezpdo_);
		 	$actividadesProgramadas = & $programa->actividades;		
			$req->listaActividadesPorProgramar=$actividadesProgramadas;
			$programa->almacenar($ezpdo_);
			$req->commit();	
			/********** GENERAR ORDEN DE PRODUCCION ********/
			$session = & $facade->getSession();
			$user = NULL;
			$total=0;
			foreach ($req->asociadoACotizacion as $solicitud)
				$total=$total + $solicitud->epGet('cantidad');
			foreach ($req->solicitudUsuario as $solicitud)
				$total=$total + $solicitud->epGet('cantidad');
			/////////////////////////////////	
			$orderProd = $session->create('DOrdenProduccion');
			$role=NULL;
			$orderProd->requerimientoOriginal=$req;
			$newEfacade1 =& EFacade :: initWorkflow($session, $orderProd, & $role);
			$newEfacade1->saveWorkflow();
			$transSetOP = & EFacade :: getCurrentTransSetAuto($newEfacade1->getWorkflow(), /* PROCESS */ 3);
			$transOP = & $transSetOP->getTransByName('t1');
			$user=NULL;
			$newEfacade1->fireTrans($transOP, $user, "Crear",TRUE);
			$orderProd->epSetDirty(TRUE);
			$newEfacade1->saveWorkflow();
			$orderProd->commit();
			$orderProd->diferenciador = $orderProd->getDocumentDifer();
			$orderProd->numero = $orderProd->getDocumentNumber();
			$orderProd->commit();
			/***********************************************/
		}
		$user = null;
		$docCP = & $facade->getDocumentRoot();
		$workflowCP = & $facade->getWorkflow();
		$transSetCP = & EFacade :: getCurrentTransSetAuto($workflowCP, /* AGENT */ 2);
		$transCP = $transSetCP->getTransByName('t7');
		$facade->fireTrans($transCP,$user,'Creacion de solicitud', TRUE);
	}
}
?>